/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Controlador.Service.Almacen;

import Controlador.Bean.Almacen.Almacen;
import Controlador.Bean.Almacen.EntradaSalida;
import Controlador.Bean.Almacen.Kardex;
import Controlador.Bean.Almacen.Producto;
import Controlador.Bean.Almacen.ProductosEnAlmacen;
import Controlador.Bean.Almacen.ProductoxAlmacen;
import Controlador.Bean.Almacen.ProdxSolicitudMovimiento;
import Controlador.Bean.Almacen.TipoProducto;
import Controlador.Bean.Almacen.SolicitudMovimiento;
import Controlador.Bean.Ventas.LineaCotizacion;
import Controlador.Service.Produccion.ServicioProductoxFase;
import Data.config.SessionFac;
import gui.General.Main;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import javax.swing.JProgressBar;
import net.sf.jasperreports.engine.convert.LineConverter;
import org.apache.ibatis.session.SqlSession;

/**
 *
 * @author César
 */
public class GestionAlmacenes {
    
    //ALMACEN
    
    public static String buscarAlmacenporNombre(String nombre){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        return sAlmacen.buscarPorNombre(nombre);
    }
    
    public static int eliminarAlmacen(String id){
        if(!almacenTieneProductos(id)){
            ServicioAlmacen sAlmacen = new ServicioAlmacen();
            sAlmacen.eliminar(id);
            return 0;
        }else{
            return 1;
        }
    }
    
    public static List<Almacen> filtrarAlmacen(String id, String nombre, String ubicacion){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        return sAlmacen.filtrarAlmacen(id, nombre, ubicacion);
    }
    
    public static boolean almacenTieneProductos(String id){
        return false;
    }
    
    public static void actualizarAlmacenes(Almacen almacen){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        sAlmacen.actualizar(almacen);
    }
    
    public static Almacen buscarAlmacenId(String id){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        return sAlmacen.buscarAlmacenId(id);
    }
    
    public static List<Almacen> obtenerAlmacenes(){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        return sAlmacen.seleccionarTodo();
    }
    
    public static List<Almacen> obtenerAlmacenesPT(){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        return sAlmacen.seleccionarAlmacenPT();
    }
    
    public static void agregarAlmacen(Almacen almacen){
        ServicioAlmacen sAlmacen = new ServicioAlmacen();
        sAlmacen.guardar(almacen);
    }
    
    //PRODUCTOS
    
    public static Double obtenerPrecio(String id){
         ServicioProducto sproducto = new ServicioProducto();
        return sproducto.obtenerPrecio(id);
    }
    
    public static Double obtenerStock(String idProducto){
        ServicioProducto sproducto = new ServicioProducto();
        return sproducto.obtenerStock(idProducto);
    }
    
    public static List<Kardex> obtenerKardex(){
        ServicioProducto sproducto = new ServicioProducto();
        return sproducto.obtenerKardex();
    }
    
    public static List<Producto> obtenerProductos(){
        ServicioProducto sproducto = new ServicioProducto();
        return sproducto.seleccionarTodo();
    }
    
    public static List<Producto> filtrarProductos(String id, String nombre){
        ServicioProducto sProducto = new ServicioProducto();
        return sProducto.filtrarProductos(id, nombre);
    }
    
    public static List<Producto> filtrarProductosporAlmacen(String idAlmacen, String id, String nombre){
        ServicioProducto sProducto = new ServicioProducto();
        List<ProductoxAlmacen> ListaIdproductos = sProducto.filtrarProductosporAlmacen(idAlmacen, id);
        List<Producto> productos =filtrarProductos("", nombre);
        ArrayList<Producto> productosxAlmacen = new ArrayList();
        for(int i=0; i<ListaIdproductos.size();i++){
            for(int j=0; j<productos.size(); j++){
                if(ListaIdproductos.get(i).getIdProducto().compareTo(productos.get(j).getIdProducto())==0){
                    productos.get(j).setCantidad(ListaIdproductos.get(i).getCantidad());
                    productosxAlmacen.add(productos.get(j));
                    productos.remove(j);
                }
            }
        }
        return productosxAlmacen;
    }
    
    public static List<ProductoxAlmacen> obtenerProductosxAlmacen(String idAlmacen, String id){
        ServicioProducto sProducto = new ServicioProducto();
        List<ProductoxAlmacen> ListaIdproductos = sProducto.filtrarProductosporAlmacen(idAlmacen, id);
        return ListaIdproductos;
    }
    
    public static void actualizarProduductos(Producto producto){
        ServicioProducto sproducto = new ServicioProducto();
        sproducto.actualizar(producto);
    }
    
    public static void actualizarListaProduductos(List<Producto> productos){
        ServicioProducto sproducto = new ServicioProducto();
        sproducto.actualizarLista(productos);
    }
    
    public static void eliminarProductos(String id){
        ServicioProducto sproducto = new ServicioProducto();
        sproducto.eliminar(id);
    }
    
    public static void agregarProducto(Producto producto){
            ServicioProducto sproducto = new ServicioProducto();
            sproducto.guardar(producto);
    }
    
    //SOLICITUD DE MOVIMIENTO
    
    public static SolicitudMovimiento obtenerSolicitudMovimientoxIdMovimiento(String idSolMov){
        ServicioSolicitudMovimiento servSolMov = new ServicioSolicitudMovimiento();
        return servSolMov.seleccionarxIdMov(idSolMov);
    }
    
    public static List<ProdxSolicitudMovimiento> obtenerProdxSolicitudMovimiento(String idSolMov){
        List<ProdxSolicitudMovimiento> pxsolmov;
        ServicioProdxSolicitudMovimiento ServProdxSolMov = new ServicioProdxSolicitudMovimiento();
        pxsolmov = ServProdxSolMov.seleccionarxSolMov(idSolMov);
        return pxsolmov;
    }
    
    public static List<SolicitudMovimiento> obtenerSolicitudMovimientoporEstado(String estado, Date Fecha){
        ServicioSolicitudMovimiento sSolMov = new ServicioSolicitudMovimiento();
        return sSolMov.seleccionarPorEstado(estado, Fecha);
    }
    
    public static void agregarSolicitudMovimiento(SolicitudMovimiento solMov){
        ServicioSolicitudMovimiento sSolMov = new ServicioSolicitudMovimiento();
        sSolMov.guardar(solMov);
    }
    
    public static String agregarSolicitudMovimientoDC(SolicitudMovimiento solMov){
        ServicioSolicitudMovimiento sSolMov = new ServicioSolicitudMovimiento();
        return sSolMov.guardarDC(solMov);
    }
    
    public static void actualizarSolicitudMovimiento(SolicitudMovimiento solMov){
        ServicioSolicitudMovimiento sSolMov = new ServicioSolicitudMovimiento();
        sSolMov.actualizar(solMov);
    }
    
    public static void eliminarSolicitudMovimiento(SolicitudMovimiento solMov){
        ServicioSolicitudMovimiento sSolMov = new ServicioSolicitudMovimiento();
        sSolMov.eliminar(solMov.getIdSolicitudMovimiento());
    }
    
    public static void agregarProdxSolMov(List<ProdxSolicitudMovimiento> prodSolMov, String idAlmacen, String tipo){
        ServicioProdxSolicitudMovimiento ServProdxSolMov = new ServicioProdxSolicitudMovimiento();
        ServicioProducto ServProd = new ServicioProducto();
        ServProdxSolMov.guardar(prodSolMov);
    } 
    
    public static boolean existeProductoenAlmacen(ProdxSolicitudMovimiento prodSolMov, String idAlmacen){
        ServicioProducto servProd = new ServicioProducto();
        List<ProductoxAlmacen> datos = servProd.filtrarProductosporAlmacen(idAlmacen,prodSolMov.getIdProducto());
        if(datos.isEmpty()){
            return false;
        }else{
            return true;
        }
    }
    
    public static void actualizarProductoxAlmacen(List<ProdxSolicitudMovimiento> prodSolMov, String idAlmacen, String tipo){
        ServicioProducto ServProd = new ServicioProducto();
        ServProd.actualizarProductoxAlmacen(prodSolMov, idAlmacen, tipo);
    }
    //MOVIMIENTO
     
    public static List<EntradaSalida> obtenerTrasaccionesPorId(String idTransaccion){
        ServicioEntradaSalida entSal = new ServicioEntradaSalida();
        return entSal.filtrarPorTransaccion(idTransaccion);
    }
    
    public static List<EntradaSalida> obtenerTransaccionesPorAlmacen(Date fechaInicio, Date fechaFin, String idAlmacen){
        ServicioEntradaSalida entSal = new ServicioEntradaSalida();
        List<EntradaSalida> datos = entSal.filtrarPorAlmacen("1", fechaInicio, fechaFin, idAlmacen);
        return datos;
    }
    
    public static void agregarTransacciones(List<EntradaSalida> transacciones){
        ServicioEntradaSalida entSal = new ServicioEntradaSalida();
        entSal.guardar(transacciones);
    }
    
    public static ArrayList<TipoProducto> obtenerTipo(){
        return DataMemoria.obtenerDatos().tipos;
    }

    public static void agregarProductoMasivo(String RutaArchivo, JProgressBar jProgressBar2) throws Exception{
               File f = new File(RutaArchivo);
                int porcentaje = 0;
                jProgressBar2.setValue(0);
       ArrayList<Producto> productos = new ArrayList();
        FileReader fis = new FileReader(f);
        BufferedReader br = new BufferedReader(fis);
        String s = null;
  
        String SplitBy = ",";

       
        while((s=br.readLine())!=null){
           String[] datos = s.split(SplitBy);
           if(datos.length != 8){
               jProgressBar2.setValue(100);
               throw new Exception("");
           }
        Producto producto = new Producto("",datos[0],datos[1],datos[2],Double.parseDouble(datos[3]),Double.parseDouble(datos[4]),datos[5],datos[6],Double.parseDouble(datos[7]));
        productos.add(producto);
        }
        agregarProductos(productos);
        porcentaje = porcentaje + 10;
        jProgressBar2.setValue(25+porcentaje%75);
    }

    private static void agregarProductos(ArrayList<Producto> productos) throws Exception{
            ServicioProducto sproducto = new ServicioProducto();
            sproducto.guardar(productos);
    }

    public static void agregarAmacenMasivo(String RutaArchivo, JProgressBar jProgressBar2) throws Exception{
          File f = new File(RutaArchivo);
                int porcentaje = 0;
                jProgressBar2.setValue(0);
       
        FileReader fis = new FileReader(f);
        BufferedReader br = new BufferedReader(fis);
        String s = null;
  
        String SplitBy = ",";

       
        while((s=br.readLine())!=null){
           String[] datos = s.split(SplitBy);
           if(datos.length != 5){
               jProgressBar2.setValue(100);
               throw new Exception("");
           }
        Almacen almacen = new Almacen("",datos[0],datos[1],Double.parseDouble(datos[2]),datos[3],datos[4]);
        agregarAlmacen(almacen);
        porcentaje = porcentaje + 30;
        jProgressBar2.setValue(porcentaje);
        }
        

    }
    
//    private static int salidaVenta(List<LineaCotizacion> linCot){
//        List<SolicitudMovimiento> solMov = new ArrayList<>();
//        List<EntradaSalida> entSal = new ArrayList<>();
//        String idAlmacen="";
//        HashMap<String, List<String>> hm = new HashMap<>();
//        List<String> productos = new ArrayList<>();
//        List<ProductoxAlmacen> prodAlm = obtenerProductosxAlmacen("", linCot.get(i).getIdProducto());
//        for(int j=0; j<prodAlm.size(); j++){
//            for(int i=0; i<linCot.size(); i++){
//                if(prodAlm.get(j).getCantidad()>=linCot.get(i).getCantidad()){
//                    
//                }
//            }
//        }
//        for(int i=0; i<linCot.size(); i++){
//            idAlmacen = hm.get(linCot.get(i).getIdProducto());
//        }
//        if(idAlmacen.compareTo("")==0){
//                return 1;
//            }
//        solMov.add(new SolicitudMovimiento("", Main.usu.getIdEmpleadoAdm(), idAlmacen, "Salida", new Date(), "Cotización: " + linCot.get(i).getIdCotizacion(), "1", "Externo"));
//        
//    }
    
    public static ArrayList<ProductoxAlmacen> ObtenerProductosEnAlmacen(){
        ArrayList<ProductoxAlmacen> productosxalmacen = new ArrayList();
        
         ServicioProductoxAlmacen sproductoxalmacen = new ServicioProductoxAlmacen();
           
        productosxalmacen = (ArrayList<ProductoxAlmacen>) sproductoxalmacen.ObtenerProductiosxAlmacen();
        
        return productosxalmacen;
        
    }
    
    public static ArrayList<ProductosEnAlmacen> ListaDeProductosPorAlmacen( ArrayList<String> productos){
       
          ArrayList<ProductoxAlmacen> productosxalmacen = new ArrayList();
          ArrayList<ProductosEnAlmacen> productosenalmacen = new ArrayList();
          ArrayList<Almacen> almacenes=(ArrayList<Almacen>) obtenerAlmacenes();
          productosxalmacen = ObtenerProductosEnAlmacen();
          String idAlmacen = new String();
          String idProducto = new String();
          double cantidad;
          
          for(int i = 0; i<productos.size(); i++){
              idProducto = productos.get(i);
              for (int j = 0; j<almacenes.size(); j++){
                  
                  idAlmacen = almacenes.get(j).getIdAlmacen();
                  
                  cantidad = ObtenerCantidadDeProductoEnALmacen(idAlmacen,idProducto,productosxalmacen);
                  if(cantidad>0){
                  ProductosEnAlmacen pem = new ProductosEnAlmacen(idAlmacen,idProducto,cantidad);                 
                  productosenalmacen.add(pem);
                  }
              }
              
              
          }
        
        return productosenalmacen;
        
    }

    private static double ObtenerCantidadDeProductoEnALmacen(String idAlmacen, String idProducto, ArrayList<ProductoxAlmacen> productosxalmacen) {
       
        for(int i = 0; i<productosxalmacen.size(); i++){
            ProductoxAlmacen productoenalmacen = productosxalmacen.get(i);
            
            if(productoenalmacen.getIdAlmacen().equals(idAlmacen) && productoenalmacen.getIdProducto().equals(idProducto)){
                return productoenalmacen.getCantidad();
                
            }
        }
        return 0;
    }
    
    
       public static  void cargaMasivaProdxAlmacen(String file){
                   SqlSession sqlSession= SessionFac.SessionFactory().openSession();
                    try{
                      
                       ServicioProductoxAlmacen servProdxAlmc= new ServicioProductoxAlmacen();       
                      
                       servProdxAlmc.cargaMasivaProdxAlmacen(file,sqlSession);
                     
                       sqlSession.commit();
                    }
                    catch(Exception e){
                        sqlSession.rollback();
                    }
                    finally{
                            sqlSession.commit();
                        sqlSession.close();
                    }         
       }
    
       
    public static boolean SePuedeEliminarProducto(String codProd){
       return new ServicioProducto().SePuedeEliminarProducto(codProd);
    }  
    
}
